package simplemaven2.vt;

import simplemaven2.vt.utils.Settings;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLDecoder;

/**
 * The File servlet for serving from absolute path.
 *
 * @author BalusC
 * @author Vit
 * @link http://balusc.blogspot.com/2007/07/fileservlet.html
 */
public class DownloadFileServlet extends HttpServlet {
    /**
     * Размер буфера
     */
    private static final int DEFAULT_BUFFER_SIZE = 10240;
    /**
     * Путь к скаченному файлу
     */
    private String filePath;

    /**
     * Инициализация сервлета с заданием пути до сформированного файла
     *
     * @throws ServletException
     */
    public void init() throws ServletException {
        this.filePath = Settings.getPathToDownload();
    }

    /**
     * Запрашивает файл и получает его
     *
     * @param request  Запрос с указанием имени файла
     * @param response Ответ с вложенным файлом
     * @throws ServletException
     * @throws IOException
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String requestedFile = request.getPathInfo();
        if (requestedFile == null) {
            response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404.
            return;
        }
        File file = new File(filePath, URLDecoder.decode(requestedFile, "UTF-8"));
        if (!file.exists()) {
            response.sendError(HttpServletResponse.SC_NOT_FOUND); // 404.
            return;
        }
        String contentType = getServletContext().getMimeType(file.getName());
        if (contentType == null) {
            contentType = "application/octet-stream";
        }
        response.reset();
        response.setBufferSize(DEFAULT_BUFFER_SIZE);
        response.setContentType(contentType);
        response.setHeader("Content-Length", String.valueOf(file.length()));
        response.setHeader("Content-Disposition", "attachment; filename=\"" + file.getName() + "\"");
        BufferedInputStream input = null;
        BufferedOutputStream output = null;
        try {
            input = new BufferedInputStream(new FileInputStream(file), DEFAULT_BUFFER_SIZE);
            output = new BufferedOutputStream(response.getOutputStream(), DEFAULT_BUFFER_SIZE);
            byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
            int length;
            while ((length = input.read(buffer)) > 0) {
                output.write(buffer, 0, length);
            }
        } finally {
            close(output);
            close(input);
        }
    }

    /**
     * Метод, закрывающий стримы
     *
     * @param resource
     */
    private static void close(Closeable resource) {
        if (resource != null) {
            try {
                resource.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
